#include <type_traits> 
#include <iostream>
#include <string>
#include <array>

namespace make_index_sequenceDemo {

    template <size_t ...N>
    static constexpr auto square_nums(size_t index, std::index_sequence<N...>) {
        constexpr auto nums = std::array{ N * N ... };
        return nums[index];
    }

    template <size_t N>
    constexpr static auto const_nums(size_t index) {
        return square_nums(index, std::make_index_sequence<N>{});
    }



    template<typename T, unsigned PrimaryDimesion, unsigned...Dimesions>
    class matrix { /**/ };

    matrix<double, 3, 3> rotation_matrix; //3x3 ratiation matrix
    matrix<double, 3, 3,3> rotation_matrix3; //3x3*3 ratiation matrix

    template<typename ...Element> 
    class tuple
    {
    };
    tuple<int, std::string> a1;  // use it like this
    tuple<int, int> a2;
    tuple<int, int, float> a3;

    void main() {
        std::cout<<  const_nums<101>(100);
        static_assert(const_nums<101>(100) == 100 * 100);

    }
}
